package com.ccyang;

import java.util.List;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.Random;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author: yangjinpeng
 * @date: 2018-12-23
 * @description: 终止操作
 */
public class StreamDemo5 {

    public static void main(String[] args) {
        // 串行
//        IntStream.range(1, 100).peek(StreamDemo5::debug).count();

        // .parallel()产生一个并行流
//        IntStream.range(1, 100).parallel().peek(StreamDemo5::debug).count();

        // 现在要实现一个这样的效果：先并行，再串行
        // 多次调用 parallel() / sequential()，以最后一次调用为准
//        IntStream.range(1,100)
//                // 调用 parallel() 产生并行流
//                .parallel().peek(StreamDemo5::debug)
//                // 调用 sequential() 产生串行流
//                .sequential().peek(StreamDemo5::debug2).count();

        // 并行流使用的线程池：ForkJoinPool.commonPool
        // 默认线程数是 当前机器的 cpu个数
        // 使用这个属性可以修改默认的线程个数
//        System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "8");
//        IntStream.range(1, 100).parallel().peek(StreamDemo5::debug).count();

        // 使用自己的线程池，不使用默认的线程池，防止任务被阻塞
        // 线程池：ForkJoinPool-1
        ForkJoinPool pool = new ForkJoinPool(8);
        pool.submit(() -> IntStream.range(1,100).parallel().peek(StreamDemo5::debug).count());
        pool.shutdown();

        synchronized(pool){
            try {
                pool.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }


    }

    public static void debug(int i){
        System.out.println("debug " + Thread.currentThread().getName() + i);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public static void debug2(int i){
        System.err.println("debug2 " + i);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}
